#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/ledc.h"  // 新增 LEDC 库（PWM 控制）

#define LED_PIN 10
#define LEDC_TIMER LEDC_TIMER_0          // 使用定时器0
#define LEDC_MODE LEDC_LOW_SPEED_MODE    // 低速模式
#define LEDC_CHANNEL LEDC_CHANNEL_0      // 使用通道0
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT  // 占空比分辨率（13位：0~8191）
#define LEDC_FREQUENCY 5000              // PWM频率（Hz）

// 初始化 PWM 配置
void init_pwm() {
    // 1. 配置定时器
    ledc_timer_config_t timer_config = {
        .speed_mode = LEDC_MODE,
        .timer_num = LEDC_TIMER,
        .duty_resolution = LEDC_DUTY_RES,
        .freq_hz = LEDC_FREQUENCY,
        .clk_cfg = LEDC_AUTO_CLK
    };
    ledc_timer_config(&timer_config);

    // 2. 配置通道
    ledc_channel_config_t channel_config = {
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL,
        .timer_sel = LEDC_TIMER,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LED_PIN,
        .duty = 0,  // 初始占空比为0（LED最暗）
        .hpoint = 0
    };
    ledc_channel_config(&channel_config);

    // 渐变参数
    int duty = 0;       // 当前占空比
    int step = 100;     // 步进值（调整此值可改变渐变速度）
    int max_duty = (1 << LEDC_DUTY_RES) - 1;  // 最大占空比（8191）

    while (1) {
        // 渐亮（从暗到亮）
        while (duty < max_duty) {
            duty += step;
            if (duty > max_duty) duty = max_duty;
            ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
            ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
            vTaskDelay(10 / portTICK_PERIOD_MS);  // 调整延时控制渐变速度
        }

        // 渐暗（从亮到暗）
        while (duty > 0) {
            duty -= step;
            if (duty < 0) duty = 0;
            ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
            ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
            vTaskDelay(10 / portTICK_PERIOD_MS);
        }
    }
}

void app_main(void) {
    printf("ESP32 PWM 呼吸灯演示\n");
    init_pwm();
}